//
//  CPJBaseViewController.swift
//  Sina
//
//  Created by YYY on 2017/7/24.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//

import UIKit

/*
 OC不支持多继承，可以通过协议替代。
 Swift中，利用extension把函数按照功能分类管理，便于阅读和维护
 
 extension中不能定义属性
 extension不能重写父类的方法，重写父类方法是子类的职责，扩展是对类的扩展
 */

//所有主控制器的基类控制器
class CPJBaseViewController: UIViewController{
    
    //访客视图字典
    var visitorInfoDictionary: [String: String]?
    
    
    //表视图
    var tableView: UITableView?
    
    //刷新控件
    var refreshControl: CPJRefreshControl?
    //上拉刷新状态
    var isPullUp = false
    
    //自定义导航栏(懒加载)
    lazy var navigationView = UINavigationBar(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 64))
    //设置导航栏标题
    lazy var navitem = UINavigationItem()
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        NotificationCenter.default.addObserver(self, selector: #selector(loginSuccess), name: NSNotification.Name(rawValue: UserLoginSuccessNotification), object: nil)
        
        setUpUI()
        
        //加载数据
        CPJNetworkManager.shared.userLogin ? loadData() : ()
 
        // Do any additional setup after loading the view.
    }
    
    //移除通知
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    //加载数据
    func loadData()
    {
        //refreshControl?.endRefreshing()
    }
    override var title: String?{
        didSet
        {
            navitem.title = title
        }
    }
}

//设置界面
extension CPJBaseViewController
{
    fileprivate func setUpUI()
    {
        //设置导航栏
        setUpNavigationView()
        
        CPJNetworkManager.shared.userLogin  ? setUpTableView() : setUpVisitorView()

    }
    
    //设置导航栏
    func setUpNavigationView()
    {
        //取消自动缩进，如果隐藏了导航栏会缩进20个点
        automaticallyAdjustsScrollViewInsets = false
        
        view.addSubview(navigationView)
        
        navigationView.items = [navitem]
        //设置导航条的渲染颜色、背景颜色
        navigationView.barTintColor = UIImage.hexString(toColor: "0XF6F6F6")
        //设置导航栏标题的字体颜色
        navigationView.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.darkGray]
        //设置导航栏item的颜色
        navigationView.tintColor = UIColor.orange
    }
    
    //设置表格视图
    func setUpTableView()
    {
        let height = tabBarController?.tabBar.bounds.height ?? 49
        
        tableView = UITableView(frame: CGRect(x: 0, y: navigationView.height, width: kScreenWidth, height: kScreenHeight - navigationView.height - height), style: .plain)
        view.addSubview(tableView!)
        //view.insertSubview(tableView!, belowSubview: navigationView)
        tableView?.dataSource = self
        tableView?.delegate = self
        
        //设置指示器
        //tableView?.scrollIndicatorInsets = tableView!.contentInset
        
        //设置内容缩进
        //tableView?.contentInset = UIEdgeInsets(top: navigationView.bounds.height, left: 0, bottom: tabBarController?.tabBar.bounds.height ?? 49, right:  0)
        
        //刷新控件
        refreshControl = CPJRefreshControl()
        tableView?.addSubview(refreshControl!)
        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
    }
    
    //设置访客视图
    fileprivate func setUpVisitorView()
    {
        navitem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(register))
        navitem.rightBarButtonItem = UIBarButtonItem(title: "登录", style: .plain, target: self, action: #selector(login))
        
        let visitorView = CPJVisitorView(frame: view.bounds)
        view.insertSubview(visitorView, belowSubview: navigationView)
        visitorView.visitorDict = visitorInfoDictionary
        
        visitorView.loginBtn.addTarget(self, action: #selector(login), for: .touchUpInside)
        visitorView.registBtn.addTarget(self, action: #selector(register), for: .touchUpInside)
    }
}

extension CPJBaseViewController
{
    //登录成功
    @objc fileprivate func loginSuccess(n: NSNotification)
    {
        navitem.leftBarButtonItem = nil
        navitem.rightBarButtonItem = nil
        
        view = nil
        
        NotificationCenter.default.removeObserver(self)
//        CPJNetworkManager.shared.userLogin  ? setUpTableView() : setUpVisitorView()
//        //加载数据
//        CPJNetworkManager.shared.userLogin ? loadData() : ()
    }
    
    @objc fileprivate func login()
    {
        //发送通知
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: UserShouldLoginNotification), object: nil)
    }
    
    @objc fileprivate func register()
    {
   
    }
}

// MARK - UITableView 数据源、代理方法
extension CPJBaseViewController: UITableViewDelegate,UITableViewDataSource
{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
    {
        //上拉刷新状态
        let sections = tableView.numberOfSections - 1
        let row = indexPath.row
        if row < 0 || sections < 0
        {
            return
        }
        let rows = tableView.numberOfRows(inSection: sections) - 1
        if row == rows && !isPullUp
        {
            //最后一行
            print("上拉刷新")
            isPullUp = true
            loadData()
        }
        
    }
}

